在 Android Studio 里使用构建分析器提升构建性能
作为 Android 开发者工具团队的成员,我和团队成员们每天都抱着将 Android 打造成最好的移动开发者平台的想法来制作各种工具。这意味着我们会构建一些帮助您开发应用的工具,让您专注于编写应用。
我们知道超长的构建既浪费时间也会打断开发流程,并且会让开发者十分沮丧。Android Studio 用户平均每周构建 65 次,所以即便每次构建只慢 10 秒钟也会浪费每个开发者一年大约 9 个小时的时间。尽管如此,如我们在稍早的文章《在 Android Studio 中优化构建速度》提到的,大约有 60% 的 Android 开发者不会去做构建分析。再加上不断增长的项目复杂度,最终导致了所有使用 Android Studio 的项目构建时间不断增长,也严重影响了开发效率。
在 Android Studio 中优化构建速度 https://medium.com/androiddevelopers/improving-build-speed-in-android-studio-3e1425274837
充分使用构建分析器 (Build Analyzer) 提供的功能
升级 Android Gradle Plugin 到 4.0.0 或更高版本。
构建或者重新构建您的工程。
通过选择 View > Tool Windows > Build 菜单来访问构建分析器,然后点击 Build Analyzer 标签。
Santa Tracker 应用是 Google 开发的一个教程性质的开源应用,为了这篇文章,我们将 clean build 这个应用,并和大家一起理解生成的构建分析报告。
Santa Tracker 应用 https://github.com/google/santa-tracker-android
打开构建分析器,您会看到 Overview 页面。这个页面展示了一些基本信息以及跳转到各个详情页的链接。如下图所示,我们立即就会发现,这个构建的耗时主要来自于任务执行而不是构建的配置。
当展开列表来查看这些任务的时候,每个任务会根据来源显示为不同的颜色。来自 Project Customizations 的任务是由您项目的本地自定义的,也是最容易被修改的。被标示为 Android/Java/Kotlin Plugins 的任务来自于核心插件。而 Other Binary Plugins 的任务要么是来自您团队成员编写的二进制插件,或者是来自第三方制作的二进制插件。
默认情况下这些任务会以展开列表的形式显示,但是也可以使用 Group by plugin 选项来按照任务来源的插件分组。这样分组会将您项目中的每个插件显示为一个节点,而不是按照单个任务来显示。
这样分组会让我可以观察到,我项目构建的大部分时间是在执行来自核心插件的任务,比如 Kotlin 或者 Android Gradle 的插件。这并不意外,尤其是在对于像 Santa Tracker 一样的项目运行全量构建的时候。而在运行增量构建的时候,核心插件的任务通常会耗费相对较少的时间,这样会便于我们发现其他插件对于构建时间的影响。
当我们需要比较添加或者升级某个插件对于构建时间影响的时候,这个插件视图格外有用,因为它会帮助您权衡更改的好处和它们对于构建时间带来的影响。无论什么时候,对于更改的谨慎是防止我们不断地增加项目构建时间的最好办法,也就能避免其影响我们的开发效率。
警告
Android 开发者官方文档|排查构建性能问题
https://developer.android.google.cn/studio/build/build-analyzer
构建分析器如何工作
Gradle Tooling API https://docs.gradle.org/current/userguide/third_party_integration.html#embedding Android Gradle Plugin https://developer.android.google.cn/studio/releases/gradle-plugin ProgressListener https://docs.gradle.org/5.1/release-notes.html#tooling-api:-enhanced/additional-progress-events
up-to-date https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks
非增量的注解处理器 https://docs.gradle.org/4.10.1/userguide/java_plugin.html#sec:incremental_annotation_processing
后续行动
issue tracker https://issuetracker.google.com/issues/new?component=192708&template=840533 Gradle Scan https://guides.gradle.org/creating-build-scans/ Build Cache https://docs.gradle.org/current/userguide/build_cache.html
推荐阅读